/*
    csrWriteBackDataGenUnit
*/
module cgu
(
    input   wire                disp_cgu,
    input   wire    [63:00]     operand1,           //gpr_output1,
    input   wire    [63:00]     operand2,           //imm_Z,
    input   wire    [63:00]     csr_data,
    input   wire    [02:00]     funct3,
    output  wire    [63:00]     csr_write_back_data
);
    wire    [63:00] cgu_operand1    =   operand1 &  {64{disp_cgu}};
    wire    [63:00] cgu_operand2    =   operand2 &  {64{disp_cgu}};
    wire	[63:00]	temp_data       =   cgu_operand1 | cgu_operand2;
/*
    funct3[1:0] == 2'b01    ->  csr_write_back_data[0] = temp_data[0]
    funct3[1:0] == 2'b10    ->  csr_write_back_data[0] ? 1'b1 : temp_data[0]
    funct3[1:0] == 2'b11    ->  csr_write_back_data[0] ? 1'b0 : temp_data[0]
*/
    assign  csr_write_back_data[00] = ( funct3[1] ? ( funct3[0] ? ( temp_data[00] ? 1'b0 : csr_data[00] ) : ( temp_data[00] ? 1'b1 : csr_data[00] )) : temp_data[00] );
    assign  csr_write_back_data[01] = ( funct3[1] ? ( funct3[0] ? ( temp_data[01] ? 1'b0 : csr_data[01] ) : ( temp_data[01] ? 1'b1 : csr_data[01] )) : temp_data[01] );
    assign  csr_write_back_data[02] = ( funct3[1] ? ( funct3[0] ? ( temp_data[02] ? 1'b0 : csr_data[02] ) : ( temp_data[02] ? 1'b1 : csr_data[02] )) : temp_data[02] );
    assign  csr_write_back_data[03] = ( funct3[1] ? ( funct3[0] ? ( temp_data[03] ? 1'b0 : csr_data[03] ) : ( temp_data[03] ? 1'b1 : csr_data[03] )) : temp_data[03] );
    assign  csr_write_back_data[04] = ( funct3[1] ? ( funct3[0] ? ( temp_data[04] ? 1'b0 : csr_data[04] ) : ( temp_data[04] ? 1'b1 : csr_data[04] )) : temp_data[04] );
    assign  csr_write_back_data[05] = ( funct3[1] ? ( funct3[0] ? ( temp_data[05] ? 1'b0 : csr_data[05] ) : ( temp_data[05] ? 1'b1 : csr_data[05] )) : temp_data[05] );
    assign  csr_write_back_data[06] = ( funct3[1] ? ( funct3[0] ? ( temp_data[06] ? 1'b0 : csr_data[06] ) : ( temp_data[06] ? 1'b1 : csr_data[06] )) : temp_data[06] );
    assign  csr_write_back_data[07] = ( funct3[1] ? ( funct3[0] ? ( temp_data[07] ? 1'b0 : csr_data[07] ) : ( temp_data[07] ? 1'b1 : csr_data[07] )) : temp_data[07] );
    assign  csr_write_back_data[08] = ( funct3[1] ? ( funct3[0] ? ( temp_data[08] ? 1'b0 : csr_data[08] ) : ( temp_data[08] ? 1'b1 : csr_data[08] )) : temp_data[08] );
    assign  csr_write_back_data[09] = ( funct3[1] ? ( funct3[0] ? ( temp_data[09] ? 1'b0 : csr_data[09] ) : ( temp_data[09] ? 1'b1 : csr_data[09] )) : temp_data[09] );
    assign  csr_write_back_data[10] = ( funct3[1] ? ( funct3[0] ? ( temp_data[10] ? 1'b0 : csr_data[10] ) : ( temp_data[10] ? 1'b1 : csr_data[10] )) : temp_data[10] );
    assign  csr_write_back_data[11] = ( funct3[1] ? ( funct3[0] ? ( temp_data[11] ? 1'b0 : csr_data[11] ) : ( temp_data[11] ? 1'b1 : csr_data[11] )) : temp_data[11] );
    assign  csr_write_back_data[12] = ( funct3[1] ? ( funct3[0] ? ( temp_data[12] ? 1'b0 : csr_data[12] ) : ( temp_data[12] ? 1'b1 : csr_data[12] )) : temp_data[12] );
    assign  csr_write_back_data[13] = ( funct3[1] ? ( funct3[0] ? ( temp_data[13] ? 1'b0 : csr_data[13] ) : ( temp_data[13] ? 1'b1 : csr_data[13] )) : temp_data[13] );
    assign  csr_write_back_data[14] = ( funct3[1] ? ( funct3[0] ? ( temp_data[14] ? 1'b0 : csr_data[14] ) : ( temp_data[14] ? 1'b1 : csr_data[14] )) : temp_data[14] );
    assign  csr_write_back_data[15] = ( funct3[1] ? ( funct3[0] ? ( temp_data[15] ? 1'b0 : csr_data[15] ) : ( temp_data[15] ? 1'b1 : csr_data[15] )) : temp_data[15] );
    assign  csr_write_back_data[16] = ( funct3[1] ? ( funct3[0] ? ( temp_data[16] ? 1'b0 : csr_data[16] ) : ( temp_data[16] ? 1'b1 : csr_data[16] )) : temp_data[16] );
    assign  csr_write_back_data[17] = ( funct3[1] ? ( funct3[0] ? ( temp_data[17] ? 1'b0 : csr_data[17] ) : ( temp_data[17] ? 1'b1 : csr_data[17] )) : temp_data[17] );
    assign  csr_write_back_data[18] = ( funct3[1] ? ( funct3[0] ? ( temp_data[18] ? 1'b0 : csr_data[18] ) : ( temp_data[18] ? 1'b1 : csr_data[18] )) : temp_data[18] );
    assign  csr_write_back_data[19] = ( funct3[1] ? ( funct3[0] ? ( temp_data[19] ? 1'b0 : csr_data[19] ) : ( temp_data[19] ? 1'b1 : csr_data[19] )) : temp_data[19] );
    assign  csr_write_back_data[20] = ( funct3[1] ? ( funct3[0] ? ( temp_data[20] ? 1'b0 : csr_data[20] ) : ( temp_data[20] ? 1'b1 : csr_data[20] )) : temp_data[20] );
    assign  csr_write_back_data[21] = ( funct3[1] ? ( funct3[0] ? ( temp_data[21] ? 1'b0 : csr_data[21] ) : ( temp_data[21] ? 1'b1 : csr_data[21] )) : temp_data[21] );
    assign  csr_write_back_data[22] = ( funct3[1] ? ( funct3[0] ? ( temp_data[22] ? 1'b0 : csr_data[22] ) : ( temp_data[22] ? 1'b1 : csr_data[22] )) : temp_data[22] );
    assign  csr_write_back_data[23] = ( funct3[1] ? ( funct3[0] ? ( temp_data[23] ? 1'b0 : csr_data[23] ) : ( temp_data[23] ? 1'b1 : csr_data[23] )) : temp_data[23] );
    assign  csr_write_back_data[24] = ( funct3[1] ? ( funct3[0] ? ( temp_data[24] ? 1'b0 : csr_data[24] ) : ( temp_data[24] ? 1'b1 : csr_data[24] )) : temp_data[24] );
    assign  csr_write_back_data[25] = ( funct3[1] ? ( funct3[0] ? ( temp_data[25] ? 1'b0 : csr_data[25] ) : ( temp_data[25] ? 1'b1 : csr_data[25] )) : temp_data[25] );
    assign  csr_write_back_data[26] = ( funct3[1] ? ( funct3[0] ? ( temp_data[26] ? 1'b0 : csr_data[26] ) : ( temp_data[26] ? 1'b1 : csr_data[26] )) : temp_data[26] );
    assign  csr_write_back_data[27] = ( funct3[1] ? ( funct3[0] ? ( temp_data[27] ? 1'b0 : csr_data[27] ) : ( temp_data[27] ? 1'b1 : csr_data[27] )) : temp_data[27] );
    assign  csr_write_back_data[28] = ( funct3[1] ? ( funct3[0] ? ( temp_data[28] ? 1'b0 : csr_data[28] ) : ( temp_data[28] ? 1'b1 : csr_data[28] )) : temp_data[28] );
    assign  csr_write_back_data[29] = ( funct3[1] ? ( funct3[0] ? ( temp_data[29] ? 1'b0 : csr_data[29] ) : ( temp_data[29] ? 1'b1 : csr_data[29] )) : temp_data[29] );
    assign  csr_write_back_data[30] = ( funct3[1] ? ( funct3[0] ? ( temp_data[30] ? 1'b0 : csr_data[30] ) : ( temp_data[30] ? 1'b1 : csr_data[30] )) : temp_data[30] );
    assign  csr_write_back_data[31] = ( funct3[1] ? ( funct3[0] ? ( temp_data[31] ? 1'b0 : csr_data[31] ) : ( temp_data[31] ? 1'b1 : csr_data[31] )) : temp_data[31] );
    assign  csr_write_back_data[32] = ( funct3[1] ? ( funct3[0] ? ( temp_data[32] ? 1'b0 : csr_data[32] ) : ( temp_data[32] ? 1'b1 : csr_data[32] )) : temp_data[32] );
    assign  csr_write_back_data[33] = ( funct3[1] ? ( funct3[0] ? ( temp_data[33] ? 1'b0 : csr_data[33] ) : ( temp_data[33] ? 1'b1 : csr_data[33] )) : temp_data[33] );
    assign  csr_write_back_data[34] = ( funct3[1] ? ( funct3[0] ? ( temp_data[34] ? 1'b0 : csr_data[34] ) : ( temp_data[34] ? 1'b1 : csr_data[34] )) : temp_data[34] );
    assign  csr_write_back_data[35] = ( funct3[1] ? ( funct3[0] ? ( temp_data[35] ? 1'b0 : csr_data[35] ) : ( temp_data[35] ? 1'b1 : csr_data[35] )) : temp_data[35] );
    assign  csr_write_back_data[36] = ( funct3[1] ? ( funct3[0] ? ( temp_data[36] ? 1'b0 : csr_data[36] ) : ( temp_data[36] ? 1'b1 : csr_data[36] )) : temp_data[36] );
    assign  csr_write_back_data[37] = ( funct3[1] ? ( funct3[0] ? ( temp_data[37] ? 1'b0 : csr_data[37] ) : ( temp_data[37] ? 1'b1 : csr_data[37] )) : temp_data[37] );
    assign  csr_write_back_data[38] = ( funct3[1] ? ( funct3[0] ? ( temp_data[38] ? 1'b0 : csr_data[38] ) : ( temp_data[38] ? 1'b1 : csr_data[38] )) : temp_data[38] );
    assign  csr_write_back_data[39] = ( funct3[1] ? ( funct3[0] ? ( temp_data[39] ? 1'b0 : csr_data[39] ) : ( temp_data[39] ? 1'b1 : csr_data[39] )) : temp_data[39] );
    assign  csr_write_back_data[40] = ( funct3[1] ? ( funct3[0] ? ( temp_data[40] ? 1'b0 : csr_data[40] ) : ( temp_data[40] ? 1'b1 : csr_data[40] )) : temp_data[40] );
    assign  csr_write_back_data[41] = ( funct3[1] ? ( funct3[0] ? ( temp_data[41] ? 1'b0 : csr_data[41] ) : ( temp_data[41] ? 1'b1 : csr_data[41] )) : temp_data[41] );
    assign  csr_write_back_data[42] = ( funct3[1] ? ( funct3[0] ? ( temp_data[42] ? 1'b0 : csr_data[42] ) : ( temp_data[42] ? 1'b1 : csr_data[42] )) : temp_data[42] );
    assign  csr_write_back_data[43] = ( funct3[1] ? ( funct3[0] ? ( temp_data[43] ? 1'b0 : csr_data[43] ) : ( temp_data[43] ? 1'b1 : csr_data[43] )) : temp_data[43] );
    assign  csr_write_back_data[44] = ( funct3[1] ? ( funct3[0] ? ( temp_data[44] ? 1'b0 : csr_data[44] ) : ( temp_data[44] ? 1'b1 : csr_data[44] )) : temp_data[44] );
    assign  csr_write_back_data[45] = ( funct3[1] ? ( funct3[0] ? ( temp_data[45] ? 1'b0 : csr_data[45] ) : ( temp_data[45] ? 1'b1 : csr_data[45] )) : temp_data[45] );
    assign  csr_write_back_data[46] = ( funct3[1] ? ( funct3[0] ? ( temp_data[46] ? 1'b0 : csr_data[46] ) : ( temp_data[46] ? 1'b1 : csr_data[46] )) : temp_data[46] );
    assign  csr_write_back_data[47] = ( funct3[1] ? ( funct3[0] ? ( temp_data[47] ? 1'b0 : csr_data[47] ) : ( temp_data[47] ? 1'b1 : csr_data[47] )) : temp_data[47] );
    assign  csr_write_back_data[48] = ( funct3[1] ? ( funct3[0] ? ( temp_data[48] ? 1'b0 : csr_data[48] ) : ( temp_data[48] ? 1'b1 : csr_data[48] )) : temp_data[48] );
    assign  csr_write_back_data[49] = ( funct3[1] ? ( funct3[0] ? ( temp_data[49] ? 1'b0 : csr_data[49] ) : ( temp_data[49] ? 1'b1 : csr_data[49] )) : temp_data[49] );
    assign  csr_write_back_data[50] = ( funct3[1] ? ( funct3[0] ? ( temp_data[50] ? 1'b0 : csr_data[50] ) : ( temp_data[50] ? 1'b1 : csr_data[50] )) : temp_data[50] );
    assign  csr_write_back_data[51] = ( funct3[1] ? ( funct3[0] ? ( temp_data[51] ? 1'b0 : csr_data[51] ) : ( temp_data[51] ? 1'b1 : csr_data[51] )) : temp_data[51] );
    assign  csr_write_back_data[52] = ( funct3[1] ? ( funct3[0] ? ( temp_data[52] ? 1'b0 : csr_data[52] ) : ( temp_data[52] ? 1'b1 : csr_data[52] )) : temp_data[52] );
    assign  csr_write_back_data[53] = ( funct3[1] ? ( funct3[0] ? ( temp_data[53] ? 1'b0 : csr_data[53] ) : ( temp_data[53] ? 1'b1 : csr_data[53] )) : temp_data[53] );
    assign  csr_write_back_data[54] = ( funct3[1] ? ( funct3[0] ? ( temp_data[54] ? 1'b0 : csr_data[54] ) : ( temp_data[54] ? 1'b1 : csr_data[54] )) : temp_data[54] );
    assign  csr_write_back_data[55] = ( funct3[1] ? ( funct3[0] ? ( temp_data[55] ? 1'b0 : csr_data[55] ) : ( temp_data[55] ? 1'b1 : csr_data[55] )) : temp_data[55] );
    assign  csr_write_back_data[56] = ( funct3[1] ? ( funct3[0] ? ( temp_data[56] ? 1'b0 : csr_data[56] ) : ( temp_data[56] ? 1'b1 : csr_data[56] )) : temp_data[56] );
    assign  csr_write_back_data[57] = ( funct3[1] ? ( funct3[0] ? ( temp_data[57] ? 1'b0 : csr_data[57] ) : ( temp_data[57] ? 1'b1 : csr_data[57] )) : temp_data[57] );
    assign  csr_write_back_data[58] = ( funct3[1] ? ( funct3[0] ? ( temp_data[58] ? 1'b0 : csr_data[58] ) : ( temp_data[58] ? 1'b1 : csr_data[58] )) : temp_data[58] );
    assign  csr_write_back_data[59] = ( funct3[1] ? ( funct3[0] ? ( temp_data[59] ? 1'b0 : csr_data[59] ) : ( temp_data[59] ? 1'b1 : csr_data[59] )) : temp_data[59] );
    assign  csr_write_back_data[60] = ( funct3[1] ? ( funct3[0] ? ( temp_data[60] ? 1'b0 : csr_data[60] ) : ( temp_data[60] ? 1'b1 : csr_data[60] )) : temp_data[60] );
    assign  csr_write_back_data[61] = ( funct3[1] ? ( funct3[0] ? ( temp_data[61] ? 1'b0 : csr_data[61] ) : ( temp_data[61] ? 1'b1 : csr_data[61] )) : temp_data[61] );
    assign  csr_write_back_data[62] = ( funct3[1] ? ( funct3[0] ? ( temp_data[62] ? 1'b0 : csr_data[62] ) : ( temp_data[62] ? 1'b1 : csr_data[62] )) : temp_data[62] );
    assign  csr_write_back_data[63] = ( funct3[1] ? ( funct3[0] ? ( temp_data[63] ? 1'b0 : csr_data[63] ) : ( temp_data[63] ? 1'b1 : csr_data[63] )) : temp_data[63] );
endmodule